<?php

namespace RjYst\Category\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
use RjYst\Category\Services\DatabaseConfigUpdater;
use RjYst\Category\Services\EnvUpdater;

class InstallCategoryCommand extends Command
{
    protected $signature = 'rjyst:install-category {--force : 强制覆盖已存在的文件}';
    protected $description = 'Install RjYst Category Package';

    public function handle()
    {
        $this->info('🚀 开始安装 RjYst Category Package...');

        // 1. 发布所有文件
        $this->publishFiles();

        // 2. 更新数据库配置
        $this->updateDatabaseConfig();

        // 3. 更新环境变量
        $this->updateEnvVariables();

        // 4. 运行迁移
        $this->runMigrations();

        // 5. 更新路由文件
        $this->updateRoutes();

        // 6. 运行数据填充（可选）
        if ($this->confirm('是否运行数据填充器？')) {
            $this->runSeeder();
        }

        // 7. 配置后台菜单（可选）
        if ($this->confirm('是否配置后台菜单？')) {
            $this->runAdminMenuSeeder();
        }

        // 8. 完成提示
        $this->displaySuccessMessage();
    }

    protected function publishFiles()
    {
        $this->info('📦 发布文件...');

        $force = $this->option('force');

        // 发布所有文件
        $this->call('vendor:publish', [
            '--tag' => 'rjyst-category-all',
            '--force' => $force
        ]);

        $this->info('✅ 文件发布完成');
    }

    protected function updateDatabaseConfig()
    {
        $this->info('🗄️ 更新数据库配置...');

        try {
            if (DatabaseConfigUpdater::hasRjmysqlConfig()) {
                $this->info('ℹ️ rjmysql 数据库配置已存在，跳过更新');
                return;
            }

            $updated = DatabaseConfigUpdater::updateDatabaseConfig();

            if ($updated) {
                $this->info('✅ 数据库配置文件更新完成');
                $this->line('   添加了 rjmysql 数据库连接配置');
            } else {
                $this->warn('⚠️ 数据库配置文件更新失败');
            }
        } catch (\Exception $e) {
            $this->error('❌ 更新数据库配置时出错: ' . $e->getMessage());
        }
    }

    protected function updateEnvVariables()
    {
        $this->info('🔧 更新环境变量...');

        try {
            if (EnvUpdater::hasEnvVariables()) {
                $this->info('ℹ️ 环境变量已存在，跳过更新');
                return;
            }

            $updated = EnvUpdater::addEnvVariables();

            if ($updated) {
                $this->info('✅ 环境变量更新完成');
                $this->line('   添加了 DB_DATABASE_ZJ、DB_USERNAME_ZJ、DB_PASSWORD_ZJ');
                $this->warn('⚠️ 请编辑 .env 文件设置正确的数据库连接信息');
            } else {
                $this->info('ℹ️ 环境变量无需更新');
            }
        } catch (\Exception $e) {
            $this->error('❌ 更新环境变量时出错: ' . $e->getMessage());
        }
    }

    protected function runMigrations()
    {
        $this->info('🗄️ 检查数据库表...');

        try {
            // 检查 categorys 表是否存在
            if ($this->checkCategorysTableExists()) {
                $this->info('ℹ️ categorys 表已存在，跳过迁移');
                return;
            }

            // 检查是否有待运行的迁移
            if (!$this->hasPendingMigrations()) {
                $this->info('ℹ️ 没有待运行的迁移');
                return;
            }

            $this->info('🗄️ 运行数据库迁移...');
            $this->call('migrate');
            $this->info('✅ 数据库迁移完成');

        } catch (\Exception $e) {
            $this->error('❌ 运行数据库迁移时出错: ' . $e->getMessage());
            $this->warn('请手动运行: php artisan migrate');
        }
    }

    /**
     * 检查 categorys 表是否存在
     */
    protected function checkCategorysTableExists()
    {
        try {
            // 方法1：使用 Schema::hasTable()
            if (Schema::hasTable('categorys')) {
                return true;
            }

            // 方法2：直接查询数据库（兜底方案）
            $connection = config('database.default');
            $database = config("database.connections.{$connection}.database");

            $tables = DB::select("SELECT table_name FROM information_schema.tables WHERE table_schema = ? AND table_name = ?",
                [$database, 'categorys']);

            return !empty($tables);

        } catch (\Exception $e) {
            $this->warn('⚠️ 无法检查表是否存在: ' . $e->getMessage());
            return false;
        }
    }

    /**
     * 检查是否有待运行的迁移
     */
    protected function hasPendingMigrations()
    {
        try {
            // 获取待运行的迁移
            $pendingMigrations = $this->getMigrator()->pendingMigrations();

            // 检查是否有与 categorys 相关的迁移
            foreach ($pendingMigrations as $migration) {
                if (str_contains($migration, 'create_categorys_table')) {
                    return true;
                }
            }

            return false;

        } catch (\Exception $e) {
            $this->warn('⚠️ 无法检查待运行的迁移: ' . $e->getMessage());
            // 如果检查失败，默认返回 true 让用户决定
            return true;
        }
    }

    /**
     * 获取迁移器实例
     */
    protected function getMigrator()
    {
        return $this->laravel['migrator'];
    }

    /**
     * 更安全的迁移运行方法
     */
    protected function runMigrationsSafely()
    {
        $this->info('🗄️ 安全运行数据库迁移...');

        try {
            // 1. 检查数据库连接
            if (!$this->checkDatabaseConnection()) {
                $this->error('❌ 数据库连接失败，请检查配置');
                return;
            }

            // 2. 检查 categorys 表
            if ($this->checkCategorysTableExists()) {
                $this->info('ℹ️ categorys 表已存在，跳过迁移');

                // 检查表结构是否完整
                if ($this->verifyCategorysTableStructure()) {
                    $this->info('✅ categorys 表结构完整');
                } else {
                    $this->warn('⚠️ categorys 表结构不完整，可能需要手动更新');
                }
                return;
            }

            // 3. 运行迁移
            $this->info('🗄️ 开始运行迁移...');

            // 只运行与 categorys 相关的迁移
            $this->runSpecificMigration();

            // 4. 验证迁移结果
            if ($this->checkCategorysTableExists()) {
                $this->info('✅ 数据库迁移完成，categorys 表创建成功');
            } else {
                $this->warn('⚠️ 迁移完成但 categorys 表未找到，请检查');
            }

        } catch (\Exception $e) {
            $this->error('❌ 运行数据库迁移时出错: ' . $e->getMessage());
            $this->warn('请手动运行: php artisan migrate');
        }
    }

    /**
     * 检查数据库连接
     */
    protected function checkDatabaseConnection()
    {
        try {
            DB::connection()->getPdo();
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }

    /**
     * 验证 categorys 表结构
     */
    protected function verifyCategorysTableStructure()
    {
        try {
            $requiredColumns = [
                'id', 'name', 'parent_id', 'level', 'path',
                'page', 'image', 'isbn', 'module',
                'unit_main_name', 'unit_name', 'is_directory',
                'created_at', 'updated_at'
            ];

            $existingColumns = Schema::getColumnListing('categorys');

            foreach ($requiredColumns as $column) {
                if (!in_array($column, $existingColumns)) {
                    $this->warn("⚠️ 缺少字段: {$column}");
                    return false;
                }
            }

            return true;

        } catch (\Exception $e) {
            return false;
        }
    }

    /**
     * 运行特定的迁移
     */
    protected function runSpecificMigration()
    {
        // 获取迁移文件路径
        $migrationPath = database_path('migrations');

        // 查找 categorys 相关的迁移文件
        $migrationFiles = File::glob($migrationPath . '/*create_categorys_table.php');

        if (!empty($migrationFiles)) {
            $this->call('migrate', ['--path' => 'database/migrations']);
        } else {
            $this->call('migrate');
        }
    }

    protected function updateRoutes()
    {
        $this->info('🔗 更新路由文件...');

        $routesFile = app_path('Admin/routes.php');

        // 确保目录存在
        $adminPath = app_path('Admin');
        if (!File::exists($adminPath)) {
            File::makeDirectory($adminPath, 0755, true);
        }

        // 如果路由文件不存在，创建基础路由文件
        if (!File::exists($routesFile)) {
            $this->createBasicRoutesFile($routesFile);
        }

        // 读取现有路由
        $routes = File::get($routesFile);

        // 检查是否已经包含分类路由
        if (!str_contains($routes, "resource('category'")) {
            $newRoute = "    \$router->resource('category', 'Category\\CategoryController');";

            // 在最后一个 }); 之前添加路由
            $routes = str_replace(
                "\n});",
                "\n    " . $newRoute . "\n});",
                $routes
            );

            File::put($routesFile, $routes);
            $this->info('✅ 路由文件更新完成');
        } else {
            $this->info('ℹ️ 路由已存在，跳过更新');
        }
    }

    protected function createBasicRoutesFile($routesFile)
    {
        $content = <<<PHP
<?php

use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Route;
use Dcat\Admin\Admin;

Admin::routes();

Route::group([
    'prefix'     => config('admin.route.prefix'),
    'namespace'  => config('admin.route.namespace'),
    'middleware' => config('admin.route.middleware'),
], function (Router \$router) {

    \$router->get('/', 'HomeController@index');

});
PHP;

        File::put($routesFile, $content);
        $this->info('✅ 创建基础路由文件');
    }

    protected function runSeeder()
    {
        $this->info('🌱 运行数据填充器...');

        try {
            // 检查表是否存在
            if (!$this->checkCategorysTableExists()) {
                $this->warn('⚠️ categorys 表不存在，跳过数据填充');
                return;
            }

            $this->call('db:seed', [
                '--class' => 'Database\\Seeders\\CategorySeeder'
            ]);

            $this->info('✅ 数据填充完成');

        } catch (\Exception $e) {
            $this->error('❌ 运行数据填充时出错: ' . $e->getMessage());
            $this->warn('请手动运行: php artisan db:seed --class=CategorySeeder');
        }
    }

    protected function runAdminMenuSeeder()
    {
        $this->info('🎛️ 配置后台菜单...');

        try {
            // 检查 admin_menu 表是否存在
            if (!Schema::hasTable('admin_menu')) {
                $this->warn('⚠️ admin_menu 表不存在，请先配置 Dcat Admin');
                return;
            }

            $this->call('db:seed', [
                '--class' => 'Database\\Seeders\\AdminMenuSeeder'
            ]);

            $this->info('✅ 后台菜单配置完成');

        } catch (\Exception $e) {
            $this->error('❌ 配置后台菜单时出错: ' . $e->getMessage());
            $this->warn('请手动运行: php artisan db:seed --class=AdminMenuSeeder');
        }
    }

    protected function displaySuccessMessage()
    {
        $this->info('🎉 RjYst Category Package 安装完成！');
        $this->line('');
        $this->line('📁 生成的文件：');
        $this->line('   - app/Models/Category/Category.php');
        $this->line('   - app/Admin/Controllers/Category/CategoryController.php');
        $this->line('   - app/Admin/Repositories/Category/Category.php');
        $this->line('   - config/rjyst-category.php');
        $this->line('   - database/migrations/*_create_categorys_table.php');
        $this->line('   - database/seeders/CategorySeeder.php');
        $this->line('   - database/seeders/AdminMenuSeeder.php');
        $this->line('');
        $this->line('🔧 配置更新：');
        $this->line('   - config/database.php (添加了 rjmysql 连接)');
        $this->line('   - .env (添加了数据库环境变量)');

        if (Schema::hasTable('categorys')) {
            $this->line('   - categorys 表 (已创建或已存在)');
        }

        if (Schema::hasTable('admin_menu')) {
            $this->line('   - admin_menu 表 (添加了后台菜单)');
        }

        $this->line('');
        $this->line('🔗 访问地址：/admin/category');
        $this->line('');
        $this->line('💡 手动命令：');
        $this->line('   - php artisan db:seed --class=CategorySeeder');
        $this->line('   - php artisan db:seed --class=AdminMenuSeeder');
        $this->line('');
        $this->warn('⚠️ 重要提醒：');
        $this->warn('   1. 请编辑 .env 文件，设置正确的第二数据库连接信息');
        $this->warn('   2. 确保已正确配置 Dcat Admin 路由');
        $this->warn('   3. 检查数据库连接是否正常工作');
        $this->warn('   4. 刷新后台页面查看新菜单');
    }
}
